package core.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import util.DbUtils;

import core.dao.ProductoDao;
import core.model.Producto;
/**
 * @author andoniibarguchilorenzo
 * clase que contiene los metodos implementados de la interface ProductoDao
 */
public class ProductoDaoImpl extends GenericDaoImpl<Producto, Integer>
		implements ProductoDao {

	@Override
	public Producto findBy(String cod_producto) {
		// TODO Auto-generated method stub

		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Producto> productos = new ArrayList<Producto>();
		try {
			ps = connection
					.prepareStatement("SELECT COD_PRODUCTO, NOMBRE, DESCRIPCION, CANTIDAD, UNIDAD, COD_SUBCATEGORIA FROM PRODUCTO WHERE COD_PRODUCTO = ?");
			ps.setString(1, cod_producto);

			ResultSet rs = ps.executeQuery();
			Producto producto = null;

			while (rs.next()) {
				producto = Producto.createProducto(rs.getString(1),
						rs.getString(2), rs.getString(3), rs.getDouble(4),
						rs.getString(5), rs.getInt(6));
				productos.add(producto);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			return productos.get(0);
		} catch (java.lang.IndexOutOfBoundsException e) {
			System.out.println("Producto no encontrado");
			return new Producto();
		}
	}
	
	@Override
	public Producto findProductoByNombre(String nombre_producto) {
		// TODO Auto-generated method stub

		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Producto> productos = new ArrayList<Producto>();
		try {
			ps = connection
					.prepareStatement("SELECT COD_PRODUCTO, NOMBRE, DESCRIPCION, CANTIDAD, UNIDAD, COD_SUBCATEGORIA FROM PRODUCTO WHERE NOMBRE = ?");
			ps.setString(1, nombre_producto);

			ResultSet rs = ps.executeQuery();
			Producto producto = null;

			while (rs.next()) {
				producto = Producto.createProducto(rs.getString(1),
						rs.getString(2), rs.getString(3), rs.getDouble(4),
						rs.getString(5), rs.getInt(6));
				productos.add(producto);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return productos.get(0);
	}

	@Override
	public List<Producto> getAllProductos(int cod_subcategoria) {
		// TODO Auto-generated method stub

		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Producto> productos = new ArrayList<Producto>();
		try {
			ps = connection
					.prepareStatement("SELECT COD_PRODUCTO, NOMBRE, DESCRIPCION, CANTIDAD, UNIDAD, COD_SUBCATEGORIA FROM PRODUCTO WHERE COD_SUBCATEGORIA = ?");
			ps.setDouble(1, cod_subcategoria);

			ResultSet rs = ps.executeQuery();
			Producto producto = null;

			while (rs.next()) {
				producto = Producto.createProducto(rs.getString(1),
						rs.getString(2), rs.getString(3), rs.getDouble(4),
						rs.getString(5), rs.getInt(6));
				productos.add(producto);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return productos;
	}

	@Override
	public List<Producto> getProducto(int cod_supermercado) {
		// TODO Auto-generated method stub
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Producto> productos = new ArrayList<Producto>();
		try {
			ps = connection
					.prepareStatement("SELECT COD_PRODUCTO, NOMBRE, DESCRIPCION, CANTIDAD, UNIDAD FROM PRODUCTO WHERE COD_PRODUCTO = (SELECT COD_PRODUCTO FROM TIENE WHERE COD_SUPERMERCADO = ?)");
			ps.setDouble(1, cod_supermercado);

			ResultSet rs = ps.executeQuery();
			Producto producto = null;

			while (rs.next()) {
				producto = Producto.createProducto(rs.getString(1),
						rs.getString(2), rs.getString(3), rs.getDouble(4),
						rs.getString(5));
				productos.add(producto);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return productos;
	}

	@Override
	public void insertProducto(Producto producto) {
		// TODO Auto-generated method stub

		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		try {
			// http://db.apache.org/derby/docs/10.7/ref/crefjavstateautogen.html
			ps = connection
					.prepareStatement(
							"INSERT INTO PRODUCTO (COD_PRODUCTO, NOMBRE, DESCRIPCION, CANTIDAD, UNIDAD, COD_SUBCATEGORIA) VALUES (?,?,?,?,?,?)");
			ps.setString(1, producto.getCodigo_barras());
			ps.setString(2, producto.getNombre());
			ps.setString(3, producto.getDescripcion());
			ps.setDouble(4, producto.getCantidad());
			ps.setString(5, producto.getUnidad());
			ps.setInt(6, producto.getCodigo_subcategoria());

			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	@Override
	public void deleteProducto(double cod_producto) {
		// TODO Auto-generated method stub
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		try {
			// http://db.apache.org/derby/docs/10.7/ref/crefjavstateautogen.html
			ps = connection
					.prepareStatement("DELETE FROM PRODUCTO WHERE COD_PRODUCTO = ?");
			ps.setDouble(1, cod_producto);

			ps.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void deleteProducto(String nombre) {
		// TODO Auto-generated method stub
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		try {
			// http://db.apache.org/derby/docs/10.7/ref/crefjavstateautogen.html
			ps = connection
					.prepareStatement("DELETE FROM PRODUCTO WHERE NOMBRE = ?");
			ps.setString(1, nombre);

			ps.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void modifyProducto(Producto producto) {
		// TODO Auto-generated method stub
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		try {
			ps = connection
					.prepareStatement("UPDATE PRODUCTO SET NOMBRE = ?, DESCRIPCION = ?, CANTIDAD = ?, UNIDAD = ? WHERE COD_PRODUCTO = ?");
			ps.setString(1, producto.getNombre());
			ps.setString(2, producto.getDescripcion());
			ps.setDouble(3, producto.getCantidad());
			ps.setString(4, producto.getUnidad());
			ps.setString(5, producto.getCodigo_barras());
			ps.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	@Override
	public void insertProductoSupermercado(int cod_empresa,
			String cod_producto, float precio) {
		
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		try {
			// http://db.apache.org/derby/docs/10.7/ref/crefjavstateautogen.html
			ps = connection
					.prepareStatement(
							"INSERT INTO TIENE (COD_EMPRESA, COD_PRODUCTO, PRECIO) VALUES (?,?,?)");
			ps.setInt(1, cod_empresa);
			ps.setString(2, cod_producto);
			ps.setFloat(3, precio);
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
	

}
